import RequestAndResponseData from './RequestAndResponseData.js'

/**
 * Класс, описывающий список запросов с содержимым
 */
export default class ListRequestAndResponseData {
    /** @type {Array.<RequestAndResponseData>} */
    data

    constructor() {
        this.data = new Array()
    }

    /**
     * В список записей запросов и ответов добавить элемент
     * @param {RequestAndResponseData} объект, получаемый в результате выполнения метода chrome.devtools.network.onRequestFinished
     */
    addEntry(obj) {
        this.data.push(obj)
    }

    addElement(requestAndResponseData) {
        this.data.push(requestAndResponseData)
    }

    /**
     * Очистить список запросов и ответов
     */
    clearList() {
        this.data = new Array()
    }

    /**
     * Получить список статусов ответов
     * @returns список статусов ответов
     */
    getAllStatus() {
        let result = new Array()
        for (let i = 0; i < this.data.length; i++) {
            if (this.data[i].getRequest() !== undefined) {
                result.push(this.data[i].getResponse().getStatus())
            }
        }

        return result
    }

    /**
     * Получить список методов запросов
     * @returns список методов запросов
     */
    getAllMethods() {
        let result = new Array()
        for (let i = 0; i < this.data.length; i++) {
            if (this.data[i].getRequest() !== undefined) {
                result.push(this.data[i].getRequest().getMethod())
            }
        }

        return result
    }

    /**
     * Получить список IP-адресов серверов
     * @returns список методов запросов
     */
    getAllServerIpAddress() {
        let result = new Array()
        for (let i = 0; i < this.data.length; i++) {
            result.push(this.data[i].getServerIpAddress())
        }

        return result
    }

    /**
     * Получить список статистики по метода запросов
     * @returns Список статистики по методам
     */
    getStatisticsMethods() {
        let result = new Object()
        let methods = this.getAllMethods()

        for (let i = 0; i < methods.length; i++) {
            let typeRequest = methods[i]

            if (result[typeRequest] === undefined) {
                result[typeRequest] = 1
            } else {
                let currentValue = result[typeRequest]
                result[typeRequest] = currentValue + 1
            }
        }

        return result
    }

    /**
     * Получить список статистики по статусам ответов
     * @returns список статистики по статусам
     */
    getStatisticsStatus() {
        let result = new Object()
        let methods = this.getAllStatus()

        for (let i = 0; i < methods.length; i++) {
            let typeRequest = methods[i]

            if (result[typeRequest] === undefined) {
                result[typeRequest] = 1
            } else {
                let currentValue = result[typeRequest]
                result[typeRequest] = currentValue + 1
            }
        }

        return result
    }

    /**
     * Получить список статистики по статусам ответов
     * @returns список статистики по статусам
     */
    getStatisticsServerIPAddress() {
        let result = new Object()
        let serverIPAddress = this.getAllServerIpAddress()

        for (let i = 0; i < serverIPAddress.length; i++) {
            let ip = serverIPAddress[i]

            if (result[ip] === undefined) {
                result[ip] = 1
            } else {
                let currentValue = result[ip]
                result[ip] = currentValue + 1
            }
        }

        return result
    }

    /**
     * Получить список статистики по запросам и ответам
     * @returns список со статистикой
     */
    getStatisticsAll() {
        let result = new Object()

        result['Methods'] = this.getStatisticsMethods()
        result['Status'] = this.getStatisticsStatus()
        result['Server IP Address'] = this.getStatisticsServerIPAddress()

        return result
    }
}